
#include <iostream>
template <typename Type>
class shared_ptr{

public:
    //构造函数
    shared_ptr(Type* ptr) : _data(ptr),_ref(new std::size_t(1)){}

    //拷贝构造函数
    shared_ptr(const shared_ptr& other):_data(other._data),_ref(other._ref){
        (*_ref)++;
    }

    //移动构造函数
    shared_ptr(shared_ptr&& other):_data(other._data),_ref(other._ref){
        other._data = nullptr;
        other._ref = nullptr;
    }

    //析构函数
    ~shared_ptr(){
        if ((*_ref) == 0){
            delete _data;
            delete _ref;
        }else{
            (*_ref)--;
        }
    }

    //解引用操作符
    Type& operator*()const{
        return *_data;
    }

    //成员访问
    Type* operator->()const{
        return _data;
    }

    //获取引用计数
    std::size_t Count()const{
        return _ref ? *_ref : 0;
    }

private:
    Type* _data;
    std::size_t* _ref;
};


